package equals;

import java.util.Date;

/**
 * @author shkstart
 * @date 2022/5/13 - 21:42
 */

/* * 面试题： == 和 equals() 区别
 *
 * 一、回顾 == 的使用：
 * == ：运算符
 * 1. 可以使用在基本数据类型变量和引用数据类型变量中
 * 2. 如果比较的是基本数据类型变量：比较两个变量保存的数据是否相等。（不一定类型要相同）
 *    如果比较的是引用数据类型变量：比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
 * 补充： == 符号使用时，必须保证符号左右两边的变量类型一致
 * 二、equals()方法的使用：
 * 1. 是一个方法，而非运算符
 * 2. 只能适用于引用数据类型
 * 3. Object类中equals()的定义：
 *    public boolean equals(Object obj) {
	        return (this == obj); //比较引用类型地址是否相同
	  }
 *    说明：Object类中定义的equals()和==的作用是相同的：比较两个对象的地址值是否相同.即两个引用是否指向同一个对象实体
 *
 * 4. 像String、Date、File、包装类等都重写了Object类中的equals()方法。重写以后，比较的不是
 *    两个引用的地址是否相同，而是比较两个对象的"实体内容"是否相同。
 *
 * 5. 通常情况下，我们自定义的类如果使用equals()的话，也通常是比较两个对象的"实体内容"是否相同。那么，我们
 *    就需要对Object类中的equals()进行重写.
 *    重写的原则：比较两个对象的实体内容是否相同.。*/
public class EqualsTest {
    public static void main(String[] args) {
        int i = 10;
        int j = 10;
        double d = 10;
        System.out.println(i == j);
        System.out.println(i == d);//自动转换类型提升

        boolean b = true;
//        System.out.println(i == b); //布尔类型不可以与其他类型比较

        char c = 10;
        System.out.println(i == c);//true
        char c1 = 65;
        char c2 = 'A';
        System.out.println(c1 == c2);

        //引用类型
        Customer cuts1 = new Customer("Violet",18);
        Customer cuts2 = new Customer("Violet",18);
        System.out.println(cuts1 == cuts2);//false

        String s1 = new String("CCTV");
        String s2 = new String("CCTV");
        System.out.println("*********************************");
        System.out.println(cuts1.equals(cuts2));//false 未改之前 是因为equals还没在Customer类中重写这个方法找不到 所以去父类找
                                                //调用的是Object中的equals 当在Customer类中重写equals,调用的就是重写的equals
        System.out.println(s1.equals(s2));//true

        Date d1 = new Date(2311313123213L);
        Date d2 = new Date(2311313123213L);
        System.out.println(d1.equals(d2));//true



    }
}
